package com.evil.application.util;

import com.evil.application.enums.form.control.ControlCodeEnum;
import com.evil.application.pojo.dto.form.control.ControlBaseInfoDTO;
import com.evil.common.file.util.PoiUtil;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.util.List;

/**
 * @author liyang
 * @date 2022-08-08 00:00
 */
public class ExportOrderUtil {

    /**
     * 创建订单工作簿
     *
     * @param controlBases    controlBases
     * @param applicationName applicationName
     * @return Workbook
     */
    public static Workbook createAppOrderWorkbook(List<ControlBaseInfoDTO> controlBases, String applicationName) {
        // 创建文件及对应的工作簿
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet(applicationName.replaceAll("/", "_"));
        // 标题样式
        CellStyle cellStyle = PoiUtil.createdCellStyle(workbook, (short) 10, true, true);
        // 创建表头
        ExportOrderUtil.createdHeader(controlBases, sheet, cellStyle);
        return workbook;
    }

    /**
     * 创建表头
     *
     * @param controlBases 控件列表
     * @param sheet        工作簿
     * @param cellStyle    表头样式
     */
    public static void createdHeader(List<ControlBaseInfoDTO> controlBases, Sheet sheet, CellStyle cellStyle) {
        Row r1 = sheet.createRow(0);
        int columnNum = 0;
        // 没有表格则单行创建表头 设置cell值
        if (controlBases.stream().noneMatch(c -> ControlCodeEnum.TABLE.getCode().equals(c.getControlCode()))) {
            for (ControlBaseInfoDTO controlBase : controlBases) {
                PoiUtil.createCell(r1, columnNum, cellStyle, controlBase.getControlTitle());
                columnNum++;
            }
            return;
        }
        Row r2 = sheet.createRow(1);
        for (ControlBaseInfoDTO controlBase : controlBases) {
            // 表格
            if (ControlCodeEnum.TABLE.getCode().equals(controlBase.getControlCode())) {
                // 表格有子级时候，表格才有效
                if (!controlBase.getChildControls().isEmpty()) {
                    for (ControlBaseInfoDTO childControl : controlBase.getChildControls()) {
                        PoiUtil.createCell(r1, columnNum, cellStyle, controlBase.getControlTitle());
                        PoiUtil.createCell(r2, columnNum, cellStyle, childControl.getControlTitle());
                        columnNum++;
                    }
                    // 合并第一行 当前表格 所占据单元格
                    sheet.addMergedRegion(new CellRangeAddress(0, 0, columnNum - controlBase.getChildControls().size(), columnNum - 1));
                }
            }
            // 非表格
            else {
                PoiUtil.createCell(r1, columnNum, cellStyle, controlBase.getControlTitle());
                PoiUtil.createCell(r2, columnNum, cellStyle, "");
                // 合并第一与第二行 当前控件 所占据单元格
                sheet.addMergedRegion(new CellRangeAddress(0, 1, columnNum, columnNum));
                columnNum++;
            }
        }
    }
}
